﻿using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using SerbinAV.MobileSales.Sales.Common;
using SerbinAV.MobileSales.Sales.DAL;
using SerbinAV.MobileSales.Sales.Views;

namespace SerbinAV.MobileSales.Sales.Presenters
{
    public class InitializePresenter:IPresenter
    {
        private const string FileSettings = "\\Settings.xml";
        private const string LogFile = "\\Log.dat";

        private IWork _work;
        private IInitializerView _view;
        private IMainView _mainView;
        
      
        public InitializePresenter(IWork work, IInitializerView view, IMainView mainView)
        {
            _work = work;
            _view = view;
            _mainView = mainView;
        }

        public bool Go()
        {
            Initialization();
            LoadSettings();
            CreateMainWindow();
            _view.Close();
            return true;
        }

        protected virtual void Initialization()
        {
            _view.Status = "Ініціалізація...";
            Work.GetInstance().PresenterFactory = new PresenterFactory();
            Work.GetInstance().SettingsSerializer = new XMLSerializeDeserialize();
            Work.GetInstance().File =
                new FileInfo(
                    Path.GetDirectoryName(new Uri(Assembly.GetCallingAssembly().GetName().CodeBase).LocalPath) + FileSettings);

            Work.GetInstance().HandlerException = new HandlerException(
                new TextSaveLoader(),
                new FileInfo(
                    Path.GetDirectoryName(new Uri(Assembly.GetCallingAssembly().GetName().CodeBase).LocalPath) + LogFile));
            _work = Work.GetInstance();
        }

        protected virtual void LoadSettings()
        {
            _view.Status = "Завантаження настройок...";
            Exception ex;
            _work.GetSettings(out ex);

            if (ex != null)
            {
                string message;
                try
                {
                    throw ex;
                }
                catch (FileNotFoundException)
                {
                    message = "Файл з настройками не знайдено";
                }
                catch (NullReferenceException)
                {
                    message = "Помилка в файлі настройок";
                }
                catch (Exception)
                {
                    message = "Неможливо завантажити настройки";
                }
                _work.HandlerException.Go(message, "Помилка при завантаженні настройок", ex);
                if (!_work.PresenterFactory.GetSettingsPresenter().Go())
                {
                    //аварійне завершення програми
                    throw new Exception();
                }
            }
        }

        protected virtual void CreateMainWindow()
        {
            _view.Status = "Формування головного вікна...";
            string dbPath = _work.GetSettings().DatabasePath;
            string dbPassword = _work.GetSettings().DatabasePassword;
            _work.DataManager = new DataManager(string.Format("Data source = {0}; password = {1}", dbPath, dbPassword));
            try
            {
                _work.DataManager.VerifyConnection();
            }
            catch(Exception ex)
            {
                _work.HandlerException.Go("Помилка при зєднанні з БД", "Помилка при зєднанні з БД", ex);
                if (!_work.PresenterFactory.GetSettingsPresenter().Go())
                {
                    //аварійне завершення програми
                    throw new Exception();
                }
            }
            _work.PresenterFactory.GetMainFormPresenter(_mainView).Go();
        }
    }
}
